package Laborum2.repository;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import Laborum2.Basicas.Publicidad;

@Component
public class JdbcPublicidadRepository implements PublicidadRepository{
	List<Publicidad> pub1 = new ArrayList <Publicidad>();
	Publicidad publicidad = new Publicidad();
	Calendar cal=Calendar.getInstance();

	@Autowired
	private DataSource dataSource;

	public List<Publicidad> obtenerPublicidad() {
		pub1 = new ArrayList <Publicidad>();
		String sql = "SELECT * from Publicidad";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			while(rs.next()){
				publicidad = new Publicidad();
				publicidad.setIdPublicidad(rs.getInt("idPublicidad"));	
				publicidad.setNombre(rs.getString("nombre"));
				publicidad.setFecInic(rs.getDate("fecInic"));
				publicidad.setFecFin(rs.getDate("fecIFin"));
				publicidad.setRucEmpresa(rs.getString("rucEmpresa"));
				publicidad.setCorreoEmresa(rs.getString("correoEmresa"));
				publicidad.setEstado(rs.getInt("estado"));
				pub1.add(publicidad);
			}
		}catch(Exception ex){
			
		}
		closeConecction(rs, ps, conn);
		return pub1;
	}

	public int obtenerIdPublicidad(int codigo) {
		for(int i=0;i<pub1.size();i++){			
			if(pub1.get(i).getIdPublicidad()==codigo){
				return pub1.get(i).getIdPublicidad();
			}
		}
		return 0;
	}


	@Override
	public List<Publicidad> obtenerPublicidadId(int codigo) {
		
		String sql = "select * from Publicidad where id=?";
		
		Publicidad publi = new Publicidad();
		
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, codigo);
			rs = ps.executeQuery();

			while (rs.next()) {				
				publi.setIdPublicidad(rs.getInt("idPublicidad"));
				publi.setNombre(rs.getString("nombre"));
				publi.setFecInic(rs.getDate("fecInic"));
				publi.setFecFin(rs.getDate("fecIFin"));
				publi.setRucEmpresa(rs.getString("rucEmpresa"));
				publi.setCorreoEmresa(rs.getString("correoEmresa"));
				publi.setEstado(rs.getInt("estado"));
				pub1.add(publi);
			}

		} catch (SQLException ex) {

		}
		closeConecction(rs, ps, conn);
		return pub1;
	}

	public void ingresar(Publicidad publicidad) {

		if (buscarXTitulo(publicidad.getNombre()).size()==0) {
		
			String sql = "insert into publicidad (idPublicidad,nombre,fecInic,fecIFin,rucEmpresa,correoEmresa,estado) " +
					"values (?,?,?,?,?,?,?)";
	
			Connection conn = null;
			PreparedStatement ps = null;

			try {
				conn = dataSource.getConnection();
				ps = conn.prepareStatement(sql);
				ps.setInt(1, publicidad.getIdPublicidad());
				ps.setString(2, publicidad.getNombre());
				ps.setDate(3, (Date) publicidad.getFecInic());
				ps.setDate(4, (Date) publicidad.getFecFin());
				ps.setString(5, publicidad.getRucEmpresa());
				ps.setString(6, publicidad.getCorreoEmresa());
				ps.setInt(7, publicidad.getEstado());
				ps.execute();
			} catch (SQLException ex) {
			}
			closeConecction1(ps, conn);
		} else {
			throw new RuntimeException("publicidad ya registrada");
		}	
	}
	
	@Override
	public void editar(int codigo, Publicidad publicidad) {

		if (obtenerPublicidadId(codigo).size() > 0) {

			String sql = "update publicidad set idPublicidad=?, nombre=?, fecInic=?, fecFin=?, rucEmpresa=?, correoEmresa=?, Estado=? where  idPublicidad=?" ;

			
			Connection conn = null;
			PreparedStatement ps = null;

			try {
				conn = dataSource.getConnection();
				ps = conn.prepareStatement(sql);
				ps.setInt(1, publicidad.getIdPublicidad());
				ps.setString(2, publicidad.getNombre());
				ps.setDate(3, (Date) publicidad.getFecInic());
				ps.setDate(4, (Date) publicidad.getFecFin());
				ps.setString(5, publicidad.getRucEmpresa());
				ps.setString(6, publicidad.getCorreoEmresa());
				ps.setInt(7, publicidad.getEstado());
				ps.execute();
			} catch (SQLException ex) {
			}
			closeConecction1(ps, conn);
		} else {
			//throw new RuntimeException("Usuario ya registrado");
		}
		
	}

	@Override
	public void eliminar(int codigo) {		
		String sql = "update publicidad set Estado=0 where  idPublicidad=?" ;
		
		Connection conn = null;
		PreparedStatement ps = null;

		try {
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, codigo);
			ps.execute();
		} catch (SQLException ex) {
		}
		closeConecction1(ps, conn);
		
	}


	@Override
	public List<Publicidad> buscarXTitulo(String titulo) {

		Publicidad publicidad = new Publicidad();
		List<Publicidad> pub = new ArrayList<Publicidad>();

		String sql = "SELECT * from Publicidad where nombre = ?";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			// Conexion
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setString(1, titulo);
			rs = ps.executeQuery();

			while (rs.next()) {
				publicidad = new Publicidad();
				// Cargo valores en la clase publicidad
				publicidad.setNombre(rs.getString("nombre"));
				publicidad.setFecInic(rs.getDate("fecInic"));
				publicidad.setFecFin(rs.getDate("fecFin"));
				publicidad.setRucEmpresa(rs.getString("rucEmpresa"));
				publicidad.setCorreoEmresa(rs.getString("correoEmresa"));
				publicidad.setEstado(rs.getInt("Estado"));

				// Cargo valores en la lista
				pub.add(publicidad);
			}
		} catch (Exception ex) {
		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);
		// Retorno Lista
		return pub;
		
	}
	
	

	@Override
	public List<Publicidad> buscarXFecha(int dias) {


		// Inicializo variables para fecha
	    Calendar cal=Calendar.getInstance();
	  	cal.setTime(new java.util.Date());
	  	java.sql.Date fecFin = new java.sql.Date(cal.getTime().getTime());
	  	cal.add(cal.DATE, -dias);
	    java.sql.Date fecIni = new java.sql.Date(cal.getTime().getTime());
	    int dI = fecIni.getDate();
	    int mI = fecIni.getMonth() + 1;
	    int aI = fecIni.getYear() + 1900;
	    int dF = fecFin.getDate();
	    int mF = fecFin.getMonth() + 1;
	    int aF = fecFin.getYear() + 1900;

	    // Inicializo variables
	    pub1 = new ArrayList <Publicidad>();
	    publicidad = new Publicidad();
		String sql = "SELECT * from publicidad where (Year(fecInic) >= ? and Month(fecInic) >= ? and Day(fecInic) >= ?) and" +
				"(Year(fecIFin) <= ? and Month(fecIFin) <= ? and Day(fecIFin) <= ?)";
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try{
			// Conexion
			conn = dataSource.getConnection();
			ps = conn.prepareStatement(sql);
			ps.setInt(1, aI);
			ps.setInt(2, mI);
			ps.setInt(3, dI);
			ps.setInt(4, aF);
			ps.setInt(5, mF);
			ps.setInt(6, dF);
			
			rs = ps.executeQuery();
			while(rs.next()){
			    publicidad = new Publicidad();
				// Cargo valores en la clase oferta
			    publicidad.setIdPublicidad(rs.getInt("IdPublicidad"));
			    publicidad.setNombre(rs.getString("Nomnbre"));
			    publicidad.setFecInic(rs.getDate("FecInic"));
			    publicidad.setFecFin(rs.getDate("FecFin"));
				publicidad.setRucEmpresa(rs.getString("rucEmpresa"));
				publicidad.setCorreoEmresa(rs.getString("correoEmresa"));
				publicidad.setCorreoEmresa(rs.getString("Estado"));
				
				// Cargo valores en la lista
				pub1.add(publicidad);
			}
		}catch(Exception ex){
			
		}
		// Cierro Conexion
		closeConecction(rs, ps, conn);
		
		//Retorno Lista
		return pub1;

	}
	
	private void closeConecction(ResultSet rs, PreparedStatement ps,
			Connection conn) {

		if (rs != null) {
			try {
				// Close to prevent database cursor exhaustion
				rs.close();
			} catch (SQLException ex) {
			}
		}
		if (ps != null) {
			try {
				// Close to prevent database cursor exhaustion
				ps.close();
			} catch (SQLException ex) {
			}
		}
		if (conn != null) {
			try {
				// Close to prevent database connection exhaustion
				conn.close();
			} catch (SQLException ex) {
			}
		}

	}	

	private void closeConecction1(PreparedStatement ps, Connection conn) {

		if (ps != null) {
			try {
				// Close to prevent database cursor exhaustion
				ps.close();
			} catch (SQLException ex) {
			}
		}
		if (conn != null) {
			try {
				// Close to prevent database connection exhaustion
				conn.close();
			} catch (SQLException ex) {
			}
		}

	}
	
}
